package com.tripcube.system.service;

import com.tripcube.system.domain.SysUserCheckins;
import com.tripcube.system.domain.dto.TravelCheckinDTO;
import com.tripcube.system.domain.vo.CheckinVO;

import java.math.BigDecimal;
import java.util.List;

/**
* @author alander
* @description 用户打卡记录表Service
* @createDate 2025-09-24 21:45:13
*/
public interface SysUserCheckinsService {

    /**
     * 根据条件分页查询打卡记录列表
     * 
     * @param checkins 打卡记录信息
     * @return 打卡记录集合信息
     */
    List<SysUserCheckins> selectCheckinsList(SysUserCheckins checkins);

    /**
     * 通过打卡记录ID查询打卡记录
     * 
     * @param id 打卡记录ID
     * @return 打卡记录对象信息
     */
    SysUserCheckins selectCheckinsById(Long id);

    /**
     * 新增打卡记录
     * 
     * @param checkins 打卡记录信息
     * @return 结果
     */
    int insertCheckins(SysUserCheckins checkins);

    /**
     * 修改打卡记录
     * 
     * @param checkins 打卡记录信息
     * @return 结果
     */
    int updateCheckins(SysUserCheckins checkins);

    /**
     * 批量删除打卡记录信息
     * 
     * @param ids 需要删除的打卡记录ID
     * @return 结果
     */
    int deleteCheckinsByIds(Long[] ids);

    /**
     * 删除打卡记录信息
     * 
     * @param id 打卡记录ID
     * @return 结果
     */
    int deleteCheckinsById(Long id);

    Long checkin(TravelCheckinDTO dto);

    /**
     * 检查用户今日是否已签到
     * @param userId 用户ID
     * @return 是否已签到
     */
    boolean checkinToday(Long userId);

    /**
     * 获取用户签到天数
     * @param userId 用户ID
     * @return 签到天数
     */
    Long checkinDays(Long userId);

    /**
     * 获取用户连续签到天数
     * @param userId 用户ID
     * @return 连续签到天数
     */
    Long continuousDays(Long userId);

    /**
     * 获取用户旅行打卡数量
     * @param userId 用户ID
     * @return 旅行打卡数量
     */
    Long travelCheckinCount(Long userId);
    /**
     * 旅行地打卡
     * @param dto 打卡信息
     * @return 打卡ID
     */
    Long travelCheckin(TravelCheckinDTO dto);

    /**
     * 获取附近打卡地点
     * @param lat 纬度
     * @param lng 经度
     * @param meter 距离范围(米)
     * @return 打卡地点列表
     */
    List<CheckinVO> nearby(BigDecimal lat, BigDecimal lng, int meter);

    /**
     * 分页查询用户打卡记录
     * @param userId 用户ID
     * @return 打卡记录分页数据
     */
    List<SysUserCheckins> pageByUser(Long userId);

    /**
     * 获取用户上月获得的积分总和
     * @param userId 用户ID
     * @return 积分总和
     */
    int sumPointsLastMonth(Long userId);

    /**
     * 撤销打卡记录
     * @param checkinId 打卡记录ID
     */
    void revoke(Long checkinId);

    /**
     * 恢复已撤销的打卡记录
     * @param checkinId 打卡记录ID
     */
    void restore(Long checkinId);
}
